package com.tbit.uqbike.webmanager.dao.stat;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tbit.config.datasource.DataSource;
import com.tbit.uqbike.object.pojo.AccountDayStat;
import com.tbit.uqbike.object.pojo.dto.RevenueDTO;
import com.tbit.uqbike.object.pojo.vo.*;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 区域预统计
 *
 * @Author:BUGTian
 * @DATE: 2022/11/1
 */
@DS(DataSource.STAT)
public interface AccountDayStatDao extends BaseMapper<AccountDayStat> {
    /**
     * 统计时间范围内预统计的区域数据
     *
     * @param startTime     开始时间 yyyyMMdd格式
     * @param endTime       结束时间 yyyyMMdd格式
     * @param accountIdList 区域id集合
     * @param oneDay        期初期末时间yyyyMMdd
     * @param brandId       品牌id
     * @return
     */
    @MapKey("dataType")
    Map<Integer, Map<String, BigDecimal>> operationalData(@Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("accountIdList") List<Integer> accountIdList, @Param("oneDay") Integer oneDay, @Param("brandId") Integer brandId);


    /**
     *
     * @param startTime             开始时间 yyyyMMdd格式
     * @param endTime               结束时间 yyyyMMdd格式
     * @param accountIdList         区域id集合
     * @param brandId               品牌id
     * @param operationalDataType   运营数据枚举
     * @return
     */
    @MapKey("dataType")
    Map<Integer, Map<String, BigDecimal>> operationalDataNew(@Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("accountIdList") List<Integer> accountIdList, @Param("brandId") Integer brandId, @Param("operationalDataType") List<Integer> operationalDataType);


    /**
     * 查询数据最近更新时间
     *
     * @param accountIdList
     * @return
     */
    Date selectLatelyDataTime(@Param("accountIdList") List<Integer> accountIdList);

    /**
     * 统计时间区间内的数据
     *
     * @param accountIds
     * @param dataTypes
     * @param startTime
     * @param endTime
     * @return
     */
    @MapKey("flag")
    Map<String, AccountDayStat> sum(@Param("accountIds") List<Integer> accountIds, @Param("dataTypes") List<Integer> dataTypes, @Param("startTime") Integer startTime, @Param("endTime") Integer endTime);

    /**
     * 按天统计区域各类型数据
     *
     * @param adAccountId
     * @param dataTypes
     * @param startTime
     * @param endTime
     * @return
     */
    @MapKey("flag")
    Map<String, AccountDayStat> sumGroupByDay(@Param("adAccountId") Integer adAccountId, @Param("dataTypes") List<Integer> dataTypes, @Param("startTime") Integer startTime, @Param("endTime") Integer endTime);


    /**
     * 统计本期欠款数据
     *
     * @param brandId
     * @param accountIds
     * @param startTime
     * @param endTime
     * @param dataTypes  类型集合
     * @return
     */
    @MapKey("flag")
    Map<String, AccountDayStat> sumArrears(@Param("brandId") Integer brandId, @Param("accountIds") List<Integer> accountIds, @Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("dataTypes") List<Integer> dataTypes);

    List<AccountDayStatMerchantFinancialDetailVO> getPlatformMerchantFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatMerchantFinancialDetailVO> getPlatformMerchantFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatOperateDetailVO> getOperateFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatOperateDetailVO> getOperateFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatBalanceDetailVO> getBalanceFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatBalanceDetailVO> getBalanceFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatDepositDetailVO> getDepositFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatDepositDetailVO> getDepositFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatGiftCardDetailVO> getGiftCardFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatGiftCardDetailVO> getGiftCardFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatFictitiousDetailVO> getFictitiousFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatFictitiousDetailVO> getFictitiousFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatArrearsDetailVO> getArrearsFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatArrearsDetailVO> getArrearsFinancialByDay(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AccountDayStatTotalDetailVO> getTotalFinancial(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    /**
     * 根据类型和日期统计区域数据 (按类型和日期分组汇总区域数据)
     *
     * @param brandId
     * @param accountIdList
     * @param startTime
     * @param endTime
     * @param typeList
     * @return
     */
    List<AccountDayStat> sumAccountAndType(@Param("brandId") Integer brandId, @Param("accountIdList") List<Integer> accountIdList, @Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("typeList") List<Integer> typeList);

    DepositTotalDetailVO getDepositTotalDetail(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<DepositDetailVO> getDepositDetailList(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    AdvanceDepositTotalDetailVO getAdvanceDepositTotalDetail(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<AdvanceDepositDetailVO> getAdvanceDepositDetailList(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    GiftCardTotalDetailVO getGiftCardTotalDetail(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    List<GiftCardDetailVO> getGiftCardDetailList(Integer startTime, Integer endTime, List<Integer> accountIds, Integer brandId);

    /**
     * 告警信息概览
     *
     * @param accountIdList
     * @param startTime
     * @param endTime
     * @param brandId
     * @return
     */
    List<ScreenPieVO> alarmMsg(@Param("accountIdList") List<Integer> accountIdList, @Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("brandId") Integer brandId);

    /**
     * 获取营收数据
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param brandId       品牌id
     * @param accountIds    区域id列表
     * @return              Map<区域id,营收数据>
     */
    @MapKey("accountId")
    Map<Integer, RevenueVO> getRevenue(@Param("startTime")Integer startTime, @Param("endTime") Integer endTime, @Param("brandId") Integer brandId, @Param("accountIds") List<Integer> accountIds);

    /**
     * 获取累计用户数
     * @param endTime           最新时间
     * @param brandId           品牌id
     * @param accountIdList     区域id
     * @return                  List<Map<String, Object>>
     */
    List<Map<String, Object>> selectCumulativeNumberOfUsers(@Param("endTime") Integer endTime, @Param("brandId") Integer brandId, @Param("accountIdList") List<Integer> accountIdList);

    /**
     * 获取营收数据 按天
     * @param startTime         开始时间
     * @param endTime           结束时间
     * @param brandId           品牌id
     * @param accountIdList     区域id
     * @return                  Map<String, RevenueVO>
     */
    @MapKey("flag")
    Map<String, RevenueGroupDayVO> getRevenueGroupDay(@Param("startTime") Integer startTime, @Param("endTime") Integer endTime, @Param("brandId") Integer brandId, @Param("accountIdList") List<Integer> accountIdList);

    /**
     * 获取计费车辆数
     * @param accountIdList     区域id
     * @param startDate         开始时间
     * @param endDate           结束时间
     * @return                  List<Map<String, Object>>
     */
    List<Map<String, Object>> selectJfcls(@Param("accountIdList") List<Integer> accountIdList, @Param("startDate") Date startDate, @Param("endDate") Date endDate);


    /**
     * 获取指定时间的设备数量和可运营设备数量
     * @param endTimeInt 时间
     * @param accountIdList 区域id
     * @param brandId 品牌id
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> getMachineNos(@Param("endTimeInt") Integer endTimeInt, @Param("accountIdList") List<Integer> accountIdList, @Param("brandId") Integer brandId);

    /**
     * 获取运营收入数据 按天
     * @param brandId       品牌id
     * @param accountIdList 区域id
     * @param startDate     开始时间
     * @param endDate       结束时间
     * @return  List<AccountDayStat>
     */
    List<AccountDayStat> selectOperatingRevenueGroupByDay(@Param("brandId") Integer brandId, @Param("accountIdList") List<Integer> accountIdList, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取今日总用户数
     * @param brandId       品牌id
     * @param accountIds    区域id列表
     * @return Integer
     */
    Integer getUserCount(@Param("brandId") Integer brandId, @Param("accountIds") List<Integer> accountIds, @Param("dataType")Integer dataType);
    /**
     * 运营报表-新，某天相关所需的dataType数据
     *
     * @param dataDate            数据日期
     * @param accountIdList       区域id集合
     * @param brandId             品牌id
     * @param operationalDataType 运营数据类型
     * @return
     */
    @MapKey("dataType")
    Map<Integer, Map<String, Object>> operationalReportOneDay(@Param("dataDate") Integer dataDate, @Param("accountIdList") List<Integer> accountIdList, @Param("brandId") Integer brandId, @Param("operationalDataType") List<Integer> operationalDataType);

    /**
     * 运营报表-新，相关所需的dataType数据-汇总
     *
     * @param beginDataDate       开始日期
     * @param endDataDate         结束日期
     * @param accountIdList       区域id集合
     * @param brandId             品牌id
     * @param operationalDataType 运营数据类型
     * @return
     */
    @MapKey("dataDate")
    Map<Integer, Map<String, Object>> operationalReportSumDay(@Param("beginDataDate") Integer beginDataDate, @Param("endDataDate") Integer endDataDate, @Param("accountIdList") List<Integer> accountIdList, @Param("brandId") Integer brandId, @Param("operationalDataType") List<Integer> operationalDataType);

    /**
     * 运营报表-列表数据，相关所需的dataType数据
     *
     * @param beginDataDate       开始日期
     * @param endDataDate         结束日期
     * @param accountIdList       区域id集合
     * @param brandId             品牌id
     * @param operationalDataType 运营数据类型
     * @return
     */
    @MapKey("flag")
    Map<String, Map<String, Object>> operationalReportMultiDay(@Param("beginDataDate") Integer beginDataDate, @Param("endDataDate") Integer endDataDate, @Param("accountIdList") List<Integer> accountIdList, @Param("brandId") Integer brandId, @Param("operationalDataType") List<Integer> operationalDataType);

    /**
     * 查询累计里程
     * @param accountIdList 区域id
     * @param brandId   品牌id
     * @param dataType  dataType
     * @return 累计里程
     */
    Long accumulatedMileage(@Param("accountIdList")List<Integer> accountIdList, @Param("brandId")Integer brandId, @Param("dataType")Integer dataType);
}
